package top.malaoshi.webmvc.utils;

import org.springframework.web.bind.annotation.*;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class MethodUtil {

    /**
     * 传入 method1，method2，判断这两个对象是否表示同一个方法
     * 判断原则：分别获取 method1，method2 的全名（调用 getAllNameOfMethod() 方法）
     * 然后比较全名是否一致，一致返回true
     * @param method1
     * @param method2
     * @return
     */
    public static boolean equals(Method method1,Method method2){

        String methodName1 = getAllNameOfMethod(method1);
        String methodName2 = getAllNameOfMethod(method2);


        return methodName1.equals(methodName2);
    }


    /**
     * 获取 方法的全名
     * 格式：访问权限 返回值 类全路径.方法名(形参类型全名1,形参类型全名2)
     * @param method
     * @return
     */
    public static String getAllNameOfMethod(Method method){
        StringBuilder ret = new StringBuilder();

        String modifier = Modifier.toString(method.getModifiers());
        String retTypeOfMethod = method.getReturnType().getName();

        ret.append(modifier);
        ret.append(" ");
        ret.append(retTypeOfMethod);
        ret.append(" ");

        Class<?> clazz = method.getDeclaringClass();
        ret.append(clazz.getName());
        ret.append(".");
        ret.append(method.getName());
        ret.append("(");

        Class<?>[] parameterTypes = method.getParameterTypes();
        for(Class item : parameterTypes){
            ret.append(item.getName());
            ret.append(",");
        }
        int length = ret.length();
        ret.delete(length-1,length);
        ret.append(")");
        return ret.toString();
    }


    /**
     * 判断该方法是否有 @RequestMapping、@GetMapping、@PostMapping、@DeleteMapping、@PutMapping 等注解
     * @param method
     * @return
     */
    public static boolean hasRequestMapping(Method method){
        boolean ret = false;

        Annotation[] annotations = method.getAnnotations();
        for(Annotation annotation : annotations){
            if( annotation instanceof RequestMapping ||
                    annotation instanceof GetMapping ||
                    annotation instanceof PostMapping ||
                    annotation instanceof DeleteMapping ||
                    annotation instanceof PutMapping
            ){
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {

    }
}
